這邊先快速探討一下 EL 工具的常見解決方案:
Fivetran 與 Stitch 是比較早就進入這個市場的領導廠商,偏好成熟、穩定軟體產品的讀者,可以優先考慮這兩家。
Singer 是 Stitch 公司開源的資料交換格式 (data exchange format)。 Airbyte 與 Meltano 這兩家是比較晚進入市場的廠商,也都支援 Singer 這個資料交換格式。
我偏好開源、新廠商的產品。一般而言,開源的軟體產品,它們有更高的機會可以被客製化、因為源碼有可能會形成社群。而新廠商能夠存活,往往是因為產品有一些創新性,畢竟,較晚開始發展的軟體產品通常有更多的機會發現過去設計的盲點,而汲取前人經驗再重練過的產品當然是有機會可以做得更好。
綜合以上所述,我的首選是 Airbyte 與 Meltano 。Airbyte 的設計,走 low code/no code 路線,這跟我的喜好有點不合,所以我選擇 Meltano ,因為它是 code first 的解決方案。
Meltano 也有提供雲端版本的,所以如果可以考慮雲端版本的讀者們,我也推荐使用雲端版本,畢竟維護本地端版本的軟體,還是滿費心的。
pipx install "meltano"
跟安裝 dbt 類似的一件事是:「準備好 python 環境」依然棘手。一旦系統有超過一個 python 直譯器,管理或是切換不同的 python 直譯器 ,就是一大麻煩。我認為,合理的解決之道,應該是要先安裝 python 直譯器的管理器,比方說,pyenv。
pipx 是一個管理 python CLI 工具的管理器,它基本上依賴於 pip
與 venv
來達成功能。讀者可以把它想象成一個先進版本的 pip ,因為它既可以安裝 CLI 工具,又可以同時確保這些安裝好的 CLI 工具所依賴的函式庫不會彼此衝突。
讀者看到這邊,可能會問,「咦,那 dbt 可不可以也用 pipx 來安裝?會不會更省事呢?這樣子就不用自己去管理 venv
了。」其實應該也很有可能,目前在 github 上已經有一些討論圍繞著這個議題發生了。
接下來會以一個常用的範例專案來示範 Meltano 用法。在資料工程的領域,最常見的用法,就是把營運資料庫 (operational database) 的資料拷貝到資料倉儲 (data warehouse) 了。
customers
的資料表,該表位於 dbt_alice
的命名空間之內。tap_postgres
的命名空間之內選擇合適的資料夾裡,下指令生成 meltano 的專案,專案名稱叫 my-meltano。
第一步完成後,可以看到 meltano.yaml
的內容,會有7行。
version: 1
default_environment: dev
project_id: c612a465-4663-4e6b-adf0-72d571865232
environments:
- name: dev
- name: staging
- name: prod
在這個步驟,通常是安裝一個 tap 與一個 target 。tap 是負責抽取 (Extract),而 target 是負責載入 (Load)。 這邊為了簡單,可以考慮直接編輯 meltano.yml
。編輯完成後,檔案內容如下:
version: 1
default_environment: dev
project_id: c612a465-4663-4e6b-adf0-72d571865232
environments:
- name: dev
- name: staging
- name: prod
plugins:
extractors:
- name: tap-postgres
variant: meltanolabs
pip_url: git+https://github.com/MeltanoLabs/tap-postgres.git
config:
host: localhost
port: 5432
user: laurencechen
password: password
database: jaffle_shop
default_replication_method: FULL_TABLE
select:
- dbt_alice-customers.*
loaders:
- name: target-postgres
variant: meltanolabs
pip_url: meltanolabs-target-postgres~=0.0.7
config:
host: localhost
port: 5432
user: laurencechen
password: password
database: laurencechen
最後,下指令 meltano install
就會開始安裝插件 (plugin)。
下完指令 meltano run tap-postgres target-postgres
後,就可以看到畫面出現許多 meltano 運作時產生的訊息。如果順利成功的話,就可以到資料倉儲去檢查,資料表是否同步了。
在 meltano.yml
裡需要特別注意 replication-method。設置時,務必要去考慮原始資料的儲存特性,要想清楚,到底資料是可變 (mutable),還是不可變 (immutable) 。做對了,可以節省很多不必要的拷貝,大幅減少營運資料庫 (operational database) 的壓力喔。